/*
 * Copyright since 2014 Shigeru GOUGI (sgougi@gmail.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.wingnest.blueprints.impls.jpa.internal.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

import com.wingnest.blueprints.impls.jpa.exceptions.BpJpaExceptionFactory;

final public class EncodeUtil {

	public static byte[] encodeValue(Object value) {
		if (value == null) return null;
		try {
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ObjectOutput out = new ObjectOutputStream(bos);
			try {
				out.writeObject(value);
				return bos.toByteArray();
			} finally {
				out.close();
				bos.close();
			}
		} catch (IOException e) {
			throw BpJpaExceptionFactory.cannotBeSerialized(value);
		}
	}

	public static Object decodeValue(byte[] value) {
		if (value == null) return null;
		try {
			ByteArrayInputStream bis = new ByteArrayInputStream(value);
			ObjectInput in = new ObjectInputStream(bis);
			try {
				return in.readObject();
			} finally {
				bis.close();
				in.close();
			}
		} catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw BpJpaExceptionFactory.cannotBeSerialized(value);
		}
	}

	private EncodeUtil() {
	}
}
